#ifndef WORKER0_H_
#define WORKER0_H_

#include <string>

using std::string;

class Worker
{
private:
    string fullname_;
    long id_;
    string type() const {return "Worker";}
protected:
    virtual void data() const;
    virtual void get();
public:
    Worker() :fullname_("None"),id_(0){}
    Worker(const string &s,long n):fullname_(s),id_(n){}
    virtual ~Worker()=0;
    virtual void set()=0;
    virtual void show() const=0;
};

class Waiter: virtual public Worker
{
private:
    int panache;
    string type()const{return "Waiter";}
protected:
    void data() const;
    void get();
public:
    Waiter():Worker(),panache(0){}
    Waiter(const string &s, long n,int p=0):Worker(s,n),panache(p){}
    Waiter(const Worker &s, int p=0):Worker(s),panache(p){}
    ~Waiter(){}
    void set();
    void show() const;
};

class Singer: virtual public Worker
{
protected:
    enum{other,alto,contralto,soprano,bass,baritone,tenor};
    enum{Vtypes=7};
    void data() const;
    void get();
private:
    static const char * pv[Vtypes];
    int voice;
    string type()const{return "Singer";}
public:
    Singer():Worker(),voice(other){}
    Singer(const string &s, long n, int v=other):Worker(s,n),voice(v){}
    Singer(const Worker &s, int v=other):Worker(s),voice(v){}
    ~Singer(){}
    void set();
    void show() const;
};

class WaiterSinger: public Waiter, public Singer
{
    protected:
        void data() const;
        void get();
    public:
        WaiterSinger():Worker(),Waiter(),Singer(){}
        WaiterSinger(const string &s, long n, int p=0, int v=other):Worker(s,n),Waiter(s,n,p),Singer(s,n,v){}
        WaiterSinger(const Worker &w, int p=0, int v=other):Worker(w),Waiter(w,p),Singer(w,v){};
        WaiterSinger(const Waiter &w, int v=other):Worker(w),Waiter(w),Singer(w,v){};
        WaiterSinger(const Singer &w, int p=0):Worker(w),Waiter(w,p),Singer(w){};
        ~WaiterSinger(){}
        void set();
        void show() const;
};

#endif
